/*
 * SPDX-FileCopyrightText: 2023-2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.output

import android.content.Context
import android.telephony.PhoneNumberUtils
import android.telephony.TelephonyManager
import android.util.Log
import java.util.Locale

/**
 * 电话号码数据类
 * 用于表示和格式化电话号码
 *
 * @param number 电话号码字符串
 */
data class PhoneNumber(private val number: String) {
    /**
     * 初始化块，验证电话号码不为空
     */
    init {
        require(number.isNotEmpty()) { "号码不能为空" }
    }

    /**
     * 根据指定格式格式化电话号码
     *
     * @param context 应用上下文
     * @param format 格式类型
     * @return 格式化后的电话号码，如果格式化失败则返回null
     */
    fun format(context: Context, format: Format) = when (format) {
        Format.DIGITS_ONLY -> number.filter { Character.digit(it, 10) != -1 }
        Format.COUNTRY_SPECIFIC -> {
            val country = getIsoCountryCode(context)
            if (country == null) {
                Log.w(TAG, "无法检测到国家")
                null
            } else {
                val formatted = PhoneNumberUtils.formatNumber(number, country)
                if (formatted == null) {
                    Log.w(TAG, "电话号码无法根据国家 $country 进行格式化")
                    null
                } else {
                    formatted
                }
            }
        }
    }

    /**
     * 重写toString方法，返回原始电话号码
     */
    override fun toString(): String = number

    companion object {
        private val TAG = PhoneNumber::class.java.simpleName

        /**
         * 获取当前ISO国家代码用于电话号码格式化
         *
         * @param context 应用上下文
         * @return ISO国家代码，如果无法获取则返回null
         */
        private fun getIsoCountryCode(context: Context): String? {
            val telephonyManager = context.getSystemService(TelephonyManager::class.java)
            var result: String? = null

            // 如果是GSM网络，优先使用网络国家代码
            if (telephonyManager.phoneType == TelephonyManager.PHONE_TYPE_GSM) {
                result = telephonyManager.networkCountryIso
            }
            // 如果网络国家代码为空，则使用SIM卡国家代码
            if (result.isNullOrEmpty()) {
                result = telephonyManager.simCountryIso
            }
            // 如果SIM卡国家代码也为空，则使用系统默认国家代码
            if (result.isNullOrEmpty()) {
                result = Locale.getDefault().country
            }
            // 如果所有方法都获取不到国家代码，则返回null
            if (result.isNullOrEmpty()) {
                return null
            }
            // 返回大写的国家代码
            return result.uppercase()
        }
    }

    /**
     * 电话号码格式枚举
     */
    enum class Format {
        DIGITS_ONLY,        // 仅数字格式
        COUNTRY_SPECIFIC,   // 国家特定格式
    }
}